﻿
namespace SistemaLogistica.DataAccess
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class BienPatrimonialData : BaseDataAccess
    {
        private BienPatrimonialData() { }

        private readonly static BienPatrimonialData instancia = new BienPatrimonialData();

        public static BienPatrimonialData Instancia
        {
            get { return instancia; }
        }

        public List<BienPatrimonial> Listar()
        {
            List<BienPatrimonial> bienes = new List<BienPatrimonial>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromBienPatrimonial");
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    BienPatrimonial bienPatrimonial = new BienPatrimonial
                    {
                        IdBien = bien.IdBien,
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        TipoBien = dr.GetInt32(dr.GetOrdinal("TipoBien"))
                    };
                    bienes.Add(bienPatrimonial);
                }
            }
            return bienes;
        }

        public List<BienPatrimonial> Buscar(string nombre)
        {
            List<BienPatrimonial> bienes = new List<BienPatrimonial>();
            DbCommand command = db.GetStoredProcCommand("GetBienPatrimonialByName");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    BienPatrimonial bienPatrimonial = new BienPatrimonial
                    {
                        IdBien = bien.IdBien,
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        TipoBien = dr.GetInt32(dr.GetOrdinal("TipoBien"))
                    };
                    bienes.Add(bienPatrimonial);
                }
            }
            return bienes;
        }

        public BienPatrimonial ObtenerPorNombre(string nombre)
        {
            BienPatrimonial bienPatrimonial = null;
            DbCommand command = db.GetStoredProcCommand("GetBienPatrimonialByNameComplete");
            db.AddInParameter(command, "nombre", DbType.String, nombre);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    bienPatrimonial = new BienPatrimonial
                    {
                        IdBien = bien.IdBien,
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        TipoBien = dr.GetInt32(dr.GetOrdinal("TipoBien"))
                    };
                }
            }
            return bienPatrimonial;
        }

        public BienPatrimonial ObtenerPorID(int idBien)
        {
            BienPatrimonial bienPatrimonial = null;
            DbCommand command = db.GetStoredProcCommand("GetBienPatrimonialByIdBien");
            db.AddInParameter(command, "idBien", DbType.Int32, idBien);
            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    bienPatrimonial = new BienPatrimonial
                    {
                        IdBien = bien.IdBien,
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        Descripcion = bien.Descripcion,
                        UnidadMedidia = bien.UnidadMedidia,
                        TipoBien = dr.GetInt32(dr.GetOrdinal("TipoBien"))
                    };
                }
            }
            return bienPatrimonial;
        }

        public int Agregar(BienPatrimonial patrimonial)
        {
            int idBien = 0, huboexito;
            using (DbConnection cnn = db.CreateConnection())
            {
                cnn.Open();
                using (DbTransaction tran = cnn.BeginTransaction())
                {
                    try
                    {
                        if (patrimonial.IdBien == 0)
                        {
                            DbCommand cmdB = db.GetStoredProcCommand("InsertBien");
                            db.AddInParameter(cmdB, "descripcion", DbType.String, patrimonial.Descripcion);
                            db.AddInParameter(cmdB, "estado", DbType.Int32, patrimonial.Estado);
                            db.AddOutParameter(cmdB, "idBien", DbType.Int32, 11);
                            db.AddInParameter(cmdB, "idUnidadMedida", DbType.Int32, patrimonial.UnidadMedidia.IdUnidadMedida);
                            db.AddInParameter(cmdB, "nombre", DbType.String, patrimonial.Nombre);
                            db.AddInParameter(cmdB, "precio", DbType.Currency, patrimonial.Precio);
                            db.AddInParameter(cmdB, "stockActual", DbType.Decimal, patrimonial.StockActual);
                            db.AddInParameter(cmdB, "stockMinimo", DbType.Decimal, patrimonial.StockMinimo);
                            huboexito = db.ExecuteNonQuery(cmdB, tran);
                            if (huboexito == 0)
                            {
                                throw new Exception("Error");
                            }

                            idBien = int.Parse(db.GetParameterValue(cmdB, "idBien").ToString());
                        }
                        else
                        {
                            DbCommand cmdB = db.GetStoredProcCommand("UpdateBien");
                            db.AddInParameter(cmdB, "descripcion", DbType.String, patrimonial.Descripcion);
                            db.AddInParameter(cmdB, "estado", DbType.Int32, patrimonial.Estado);
                            db.AddInParameter(cmdB, "idBien", DbType.Int32, patrimonial.IdBien);
                            db.AddInParameter(cmdB, "idUnidadMedida", DbType.Int32, patrimonial.UnidadMedidia.IdUnidadMedida);
                            db.AddInParameter(cmdB, "nombre", DbType.String, patrimonial.Nombre);
                            db.AddInParameter(cmdB, "precio", DbType.Currency, patrimonial.Precio);
                            db.AddInParameter(cmdB, "stockActual", DbType.Decimal, patrimonial.StockActual);
                            db.AddInParameter(cmdB, "stockMinimo", DbType.Decimal, patrimonial.StockMinimo);
                            huboexito = db.ExecuteNonQuery(cmdB, tran);
                            if (huboexito == 0)
                            {
                                throw new Exception("Error");
                            }
                            idBien = patrimonial.IdBien;
                        }

                        DbCommand cmdP = db.GetStoredProcCommand("InsertBienPatrimonial");
                        db.AddInParameter(cmdP, "idBien", DbType.Int32, idBien);
                        db.AddInParameter(cmdP, "tipoBien", DbType.Int32, patrimonial.TipoBien);
                        huboexito = db.ExecuteNonQuery(cmdP, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
            return idBien;
        }

        public void Modificar(BienPatrimonial patrimonial)
        {
            int huboexito;
            using (DbConnection cnn = db.CreateConnection())
            {
                cnn.Open();
                using (DbTransaction tran = cnn.BeginTransaction())
                {
                    try
                    {
                        DbCommand cmdB = db.GetStoredProcCommand("UpdateBien");
                        db.AddInParameter(cmdB, "descripcion", DbType.String, patrimonial.Descripcion);
                        db.AddInParameter(cmdB, "estado", DbType.Int32, patrimonial.Estado);
                        db.AddInParameter(cmdB, "idBien", DbType.Int32, patrimonial.IdBien);
                        db.AddInParameter(cmdB, "idUnidadMedida", DbType.Int32, patrimonial.UnidadMedidia.IdUnidadMedida);
                        db.AddInParameter(cmdB, "nombre", DbType.String, patrimonial.Nombre);
                        db.AddInParameter(cmdB, "precio", DbType.Currency, patrimonial.Precio);
                        db.AddInParameter(cmdB, "stockActual", DbType.Decimal, patrimonial.StockActual);
                        db.AddInParameter(cmdB, "stockMinimo", DbType.Decimal, patrimonial.StockMinimo);
                        huboexito = db.ExecuteNonQuery(cmdB, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }

                        DbCommand cmdP = db.GetStoredProcCommand("UpdateBienPatrimonial");
                        db.AddInParameter(cmdP, "idBien", DbType.Int32, patrimonial.IdBien);
                        db.AddInParameter(cmdP, "tipoBien", DbType.Int32, patrimonial.TipoBien);
                        huboexito = db.ExecuteNonQuery(cmdP, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
        }

        public void Eliminar(int idBien)
        {
            using (DbConnection cnn = db.CreateConnection())
            {
                cnn.Open();
                using (DbTransaction tran = cnn.BeginTransaction())
                {
                    try
                    {
                        DbCommand cmdB = db.GetStoredProcCommand("DeleteBienPatrimonial");
                        db.AddInParameter(cmdB, "idBien", DbType.Int32, idBien);
                        int huboexito = db.ExecuteNonQuery(cmdB, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
        }
    }
}
